#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=40;
int dp[maxn][maxn]; // i 个节点 高度为 j 的非对称二叉树的个数
// 由题意便可知道, 考虑以 .. 为根, 根本就是不可能的, 太复杂的
// 相反直接考虑节点的个数这样转移方程就容易考虑了
// 一颗树是非对称二叉树, 需要满足的条件就是 左右子树都是非对称二叉树
// 并且 max(l,r)>=k*min(l,r)
// 根据我们的定义, 前两条直接就满足, 只需要 max(l,r)>k*min(l,r)
int n, k;

void solve(){
	cin>>n>>k;
	// 不要忘记初始化
	dp[0][0]=1;
	dp[1][1]=1;
	
	for(int i=2;i<=n;i++){ // 总的节点的个数
		for(int lchild=0;lchild<=i;lchild++){ // 左儿子个数
			int rcld=i-lchild-1; // 右儿子个数
			for(int hl=0;hl<=lchild;hl++){ // 左儿子的高度
				for(int hr=0;hr<=rcld;hr++){
					// 需要满足的条件
					int height=max(hl, hr)+1;
					if((height-1)>=k*min(hl, hr)){
						dp[i][height]+=dp[lchild][hl]*dp[rcld][hr];
					}
//					cout<<"i "<<i<<"  height "<<height<<' '<<dp[i][height]<<'\n';
				}
			}
		}
	}
	int ans=0;
	for(int i=0;i<=n;i++){
		ans+=dp[n][i];
	}
	cout<<ans<<'\n';
	
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
